/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package prostagra;

import java.awt.Image;
import javax.swing.ImageIcon;
import obiekty.Drzewko;
import obiekty.Gaunt;
import obiekty.Genokrad;
import obiekty.Gracz;
import obiekty.Grupa;
import obiekty.Mur;
import obiekty.ObiektRuchomy;
import obiekty.ObiektStaly;
import obiekty.Potwor;
import obiekty.Ruiny;
import obiekty.Zoanthrope;
import utils.Vector2D;
import zachowania.potwor.Szukaj;

/**
 *
 * @author m
 */
public class MapoWczytywacz
{

    private long tempTime = 0;
    private long spawnTime = (long) 8000.0;
    private int spawnVer = 0;
    private int flaga = 0;
    
    
    
    public void dodajObiekty(int rozmiarX, int rozmiarY)
    {
        Mapa mapa = Mapa.getInstance();
        
        if (System.currentTimeMillis() - tempTime > spawnTime)
        {
            tempTime = System.currentTimeMillis();
            if (spawnVer < 8)
            {
                ObiektRuchomy ludek8 = new Gaunt(new ImageIcon("p4.gif").getImage());
                this.wyznaczPozycje(ludek8, rozmiarX, rozmiarY);
                ludek8.setMaxSila(20.0);
                ludek8.setMaxPredkosc(0.3);
                ludek8.setMasa(102.0);
                ludek8.setPredkosc(new Vector2D(-0.2, 0));
                ludek8.setOrientacja(ludek8.getPredkosc().normalize());
                ((Potwor) (ludek8)).zmienStan(new Szukaj());
                mapa.addObiektRuchomy(ludek8);
                spawnVer++;
            } else if (spawnVer < 20)
            {
                ObiektRuchomy ludek8 = new Genokrad(new ImageIcon("p6.gif").getImage());
                MapoWczytywacz.wyznaczPozycje(ludek8, rozmiarX, rozmiarY);
                ludek8.setMaxSila(20.0);
                ludek8.setMaxPredkosc(0.3);
                ludek8.setMasa(102.0);
                ludek8.setPredkosc(new Vector2D(-0.2, 0));
                ludek8.setOrientacja(ludek8.getPredkosc().normalize());
                ((Potwor) (ludek8)).zmienStan(new Szukaj());
                mapa.addObiektRuchomy(ludek8);
                spawnVer++;
            } else if (spawnVer < 26)
            {
                spawnVer++;
                if (flaga==0){
                    flaga++;
                
                // DODAJEMY PRZYWÓDCĘ
                ObiektRuchomy ludek5 = new Zoanthrope(new ImageIcon("p5.gif").getImage());
                //ludek5.setPozycja(new Vector2D(200.0, 500.0));
                MapoWczytywacz.wyznaczPozycje(ludek5, rozmiarX, rozmiarY);
                ludek5.setMaxSila(20.0);
                ludek5.setMaxPredkosc(0.3);
                ludek5.setMasa(102.0);
                ludek5.setPredkosc(new Vector2D(-0.2, 0));
                ludek5.setOrientacja(ludek5.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek5);
                

                // DODAJEMY ZAŁOGĘ PRZYWÓDCY
                ObiektRuchomy ludek1 = new Gaunt(new ImageIcon("p4.gif").getImage());
                MapoWczytywacz.wyznaczPozycjeWPromieniu(ludek1, rozmiarX, rozmiarY, 120, ludek5);
                ludek1.setMaxSila(20.0);
                ludek1.setMaxPredkosc(0.3);
                ludek1.setMasa(102.0);
                ludek1.setPredkosc(new Vector2D(-0.2, 0));
                ludek1.setOrientacja(ludek1.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek1);

                ObiektRuchomy ludek2 = new Gaunt(new ImageIcon("p4.gif").getImage());
                MapoWczytywacz.wyznaczPozycjeWPromieniu(ludek2, rozmiarX, rozmiarY, 120, ludek5);
                ludek2.setMaxSila(20.0);
                ludek2.setMaxPredkosc(0.3);
                ludek2.setMasa(102.0);
                ludek2.setPredkosc(new Vector2D(-0.2, 0));
                ludek2.setOrientacja(ludek2.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek2);


                ObiektRuchomy ludek3 = new Gaunt(new ImageIcon("p4.gif").getImage());
                MapoWczytywacz.wyznaczPozycjeWPromieniu(ludek3, rozmiarX, rozmiarY, 120, ludek5);
                ludek3.setMaxSila(20.0);
                ludek3.setMaxPredkosc(0.3);
                ludek3.setMasa(102.0);
                ludek3.setPredkosc(new Vector2D(-0.2, 0));
                ludek3.setOrientacja(ludek3.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek3);


                ObiektRuchomy ludek4 = new Gaunt(new ImageIcon("p4.gif").getImage());
                MapoWczytywacz.wyznaczPozycjeWPromieniu(ludek4, rozmiarX, rozmiarY, 120, ludek5);
                ludek4.setMaxSila(20.0);
                ludek4.setMaxPredkosc(0.3);
                ludek4.setMasa(102.0);
                ludek4.setPredkosc(new Vector2D(-0.2, 0));
                ludek4.setOrientacja(ludek4.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek4);

                Grupa grupa = new Grupa();
                grupa.addObiekt(ludek1);
                grupa.addObiekt(ludek2);
                grupa.addObiekt(ludek3);
                grupa.addObiekt(ludek4);
                grupa.addObiekt(ludek5);
                grupa.setPrzywodca(ludek5);


                ludek1.setGrupa(grupa);
                ludek2.setGrupa(grupa);
                ludek3.setGrupa(grupa);
                ludek4.setGrupa(grupa);
                ludek5.setGrupa(grupa);
                }else{flaga--;}

            } else
            {if (flaga == 3){
                flaga=0;
                // DODAJEMY PRZYWÓDCĘ
                ObiektRuchomy ludek5 = new Zoanthrope(new ImageIcon("p5.gif").getImage());
                //ludek5.setPozycja(new Vector2D(200.0, 500.0));
                MapoWczytywacz.wyznaczPozycje(ludek5, rozmiarX, rozmiarY);
                ludek5.setMaxSila(20.0);
                ludek5.setMaxPredkosc(0.3);
                ludek5.setMasa(102.0);
                ludek5.setPredkosc(new Vector2D(-0.2, 0));
                ludek5.setOrientacja(ludek5.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek5);
                spawnVer++;

                // DODAJEMY ZAŁOGĘ PRZYWÓDCY
                ObiektRuchomy ludek1 = new Genokrad(new ImageIcon("p6.gif").getImage());
                MapoWczytywacz.wyznaczPozycjeWPromieniu(ludek1, rozmiarX, rozmiarY, 120, ludek5);
                ludek1.setMaxSila(20.0);
                ludek1.setMaxPredkosc(0.3);
                ludek1.setMasa(102.0);
                ludek1.setPredkosc(new Vector2D(-0.2, 0));
                ludek1.setOrientacja(ludek1.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek1);

                ObiektRuchomy ludek2 = new Genokrad(new ImageIcon("p6.gif").getImage());
                MapoWczytywacz.wyznaczPozycjeWPromieniu(ludek2, rozmiarX, rozmiarY, 120, ludek5);
                ludek2.setMaxSila(20.0);
                ludek2.setMaxPredkosc(0.3);
                ludek2.setMasa(102.0);
                ludek2.setPredkosc(new Vector2D(-0.2, 0));
                ludek2.setOrientacja(ludek2.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek2);


                ObiektRuchomy ludek3 = new Genokrad(new ImageIcon("p6.gif").getImage());
                MapoWczytywacz.wyznaczPozycjeWPromieniu(ludek3, rozmiarX, rozmiarY, 120, ludek5);
                ludek3.setMaxSila(20.0);
                ludek3.setMaxPredkosc(0.3);
                ludek3.setMasa(102.0);
                ludek3.setPredkosc(new Vector2D(-0.2, 0));
                ludek3.setOrientacja(ludek3.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek3);


                ObiektRuchomy ludek4 = new Genokrad(new ImageIcon("p6.gif").getImage());
                MapoWczytywacz.wyznaczPozycjeWPromieniu(ludek4, rozmiarX, rozmiarY, 120, ludek5);
                ludek4.setMaxSila(20.0);
                ludek4.setMaxPredkosc(0.3);
                ludek4.setMasa(102.0);
                ludek4.setPredkosc(new Vector2D(-0.2, 0));
                ludek4.setOrientacja(ludek4.getPredkosc().normalize());
                mapa.addObiektRuchomy(ludek4);

                Grupa grupa = new Grupa();
                grupa.addObiekt(ludek1);
                grupa.addObiekt(ludek2);
                grupa.addObiekt(ludek3);
                grupa.addObiekt(ludek4);
                grupa.addObiekt(ludek5);
                grupa.setPrzywodca(ludek5);


                ludek1.setGrupa(grupa);
                ludek2.setGrupa(grupa);
                ludek3.setGrupa(grupa);
                ludek4.setGrupa(grupa);
                ludek5.setGrupa(grupa);
             }else{
                 flaga++;
             }

            }
        }
    }
    
    
    
    public Mapa wczytajMape(String nazwaPliku, int rozmiarX, int rozmiarY)
    {
        Mapa mapa = Mapa.getInstance();

        dodajObiektyStale(mapa, rozmiarX, rozmiarY);


        // DODAJEMY GRACZA
        ObiektRuchomy gracz = new Gracz(new ImageIcon("p2.png").getImage());
        //wyznaczPozycje(gracz, rozmiarX, rozmiarY);
        gracz.setPozycja(new Vector2D(900.0, 800.0));
        gracz.setMaxSila(20.0);
        gracz.setMaxPredkosc(0.3);
        gracz.setMasa(102.0);
        gracz.setPredkosc(new Vector2D(-0.1, 0));
        gracz.setOrientacja(gracz.getPredkosc().normalize());
        mapa.setGracz(gracz);


        // DODAJEMY PRZYWÓDCĘ
        ObiektRuchomy ludek5 = new Zoanthrope(new ImageIcon("p5.gif").getImage());
        ludek5.setPozycja(new Vector2D(200.0, 500.0));
        ludek5.setMaxSila(20.0);
        ludek5.setMaxPredkosc(0.3);
        ludek5.setMasa(102.0);
        ludek5.setPredkosc(new Vector2D(-0.2, 0));
        ludek5.setOrientacja(ludek5.getPredkosc().normalize());
        mapa.addObiektRuchomy(ludek5);

        // DODAJEMY ZAŁOGĘ PRZYWÓDCY
        ObiektRuchomy ludek1 = new Genokrad(new ImageIcon("p6.gif").getImage());
        wyznaczPozycjeWPromieniu(ludek1, rozmiarX, rozmiarY, 120, ludek5);
        ludek1.setMaxSila(20.0);
        ludek1.setMaxPredkosc(0.3);
        ludek1.setMasa(102.0);
        ludek1.setPredkosc(new Vector2D(-0.2, 0));
        ludek1.setOrientacja(ludek1.getPredkosc().normalize());
        mapa.addObiektRuchomy(ludek1);

        ObiektRuchomy ludek2 = new Genokrad(new ImageIcon("p6.gif").getImage());
        wyznaczPozycjeWPromieniu(ludek2, rozmiarX, rozmiarY, 120, ludek5);
        ludek2.setMaxSila(20.0);
        ludek2.setMaxPredkosc(0.3);
        ludek2.setMasa(102.0);
        ludek2.setPredkosc(new Vector2D(-0.2, 0));
        ludek2.setOrientacja(ludek2.getPredkosc().normalize());
        mapa.addObiektRuchomy(ludek2);


        ObiektRuchomy ludek3 = new Genokrad(new ImageIcon("p6.gif").getImage());
        wyznaczPozycjeWPromieniu(ludek3, rozmiarX, rozmiarY, 120, ludek5);
        ludek3.setMaxSila(20.0);
        ludek3.setMaxPredkosc(0.3);
        ludek3.setMasa(102.0);
        ludek3.setPredkosc(new Vector2D(-0.2, 0));
        ludek3.setOrientacja(ludek3.getPredkosc().normalize());
        mapa.addObiektRuchomy(ludek3);


        ObiektRuchomy ludek4 = new Genokrad(new ImageIcon("p6.gif").getImage());
        wyznaczPozycjeWPromieniu(ludek4, rozmiarX, rozmiarY, 120, ludek5);
        ludek4.setMaxSila(20.0);
        ludek4.setMaxPredkosc(0.3);
        ludek4.setMasa(102.0);
        ludek4.setPredkosc(new Vector2D(-0.2, 0));
        ludek4.setOrientacja(ludek4.getPredkosc().normalize());
        mapa.addObiektRuchomy(ludek4);

        ObiektRuchomy ludek6 = new Gaunt(new ImageIcon("p4.gif").getImage());
        wyznaczPozycjeWPromieniu(ludek6, rozmiarX, rozmiarY, 220, ludek5);
        ludek6.setMaxSila(20.0);
        ludek6.setMaxPredkosc(0.3);
        ludek6.setMasa(102.0);
        ludek6.setPredkosc(new Vector2D(-0.2, 0));
        ludek6.setOrientacja(ludek6.getPredkosc().normalize());
        ((Potwor) (ludek6)).zmienStan(new Szukaj());
        mapa.addObiektRuchomy(ludek6);

        ObiektRuchomy ludek7 = new Gaunt(new ImageIcon("p4.gif").getImage());
        wyznaczPozycjeWPromieniu(ludek7, rozmiarX, rozmiarY, 220, ludek6);
        ludek7.setMaxSila(20.0);
        ludek7.setMaxPredkosc(0.3);
        ludek7.setMasa(102.0);
        ludek7.setPredkosc(new Vector2D(-0.2, 0));
        ludek7.setOrientacja(ludek7.getPredkosc().normalize());
        ((Potwor) (ludek7)).zmienStan(new Szukaj());
        mapa.addObiektRuchomy(ludek7);

        ObiektRuchomy ludek8 = new Gaunt(new ImageIcon("p4.gif").getImage());
        wyznaczPozycjeWPromieniu(ludek8, rozmiarX, rozmiarY, 220, ludek7);
        ludek8.setMaxSila(20.0);
        ludek8.setMaxPredkosc(0.3);
        ludek8.setMasa(102.0);
        ludek8.setPredkosc(new Vector2D(-0.2, 0));
        ludek8.setOrientacja(ludek8.getPredkosc().normalize());
        ((Potwor) (ludek8)).zmienStan(new Szukaj());
        mapa.addObiektRuchomy(ludek8);

        Grupa grupa = new Grupa();
        grupa.addObiekt(ludek1);
        grupa.addObiekt(ludek2);
        grupa.addObiekt(ludek3);
        grupa.addObiekt(ludek4);
        grupa.addObiekt(ludek5);
        grupa.setPrzywodca(ludek5);


        ludek1.setGrupa(grupa);
        ludek2.setGrupa(grupa);
        ludek3.setGrupa(grupa);
        ludek4.setGrupa(grupa);
        ludek5.setGrupa(grupa);

        return mapa;
    }
    
    
    
    

    private void dodajObiektyStale(Mapa mapa, int rozmiarX, int rozmiarY)
    {
        ObiektStaly ruinki = new Ruiny((new ImageIcon("Destroyed Building.gif").getImage()));
        ruinki.setPozycja(new Vector2D(50.0, 150.0));

        Image c = new ImageIcon("tree-big.png").getImage();
        ObiektStaly drzewo = new Drzewko((c.getScaledInstance(c.getWidth(null) / 2, c.getHeight(null) / 2, Image.SCALE_DEFAULT)));
        drzewo.setPozycja(new Vector2D(650.0, 300.0));

        mapa.addObiektStaly(ruinki);
        mapa.addObiektStaly(drzewo);
        mapa.setBackground(new ImageIcon("ziemia.jpg").getImage());

        // mur z góry
        mapa.addMur(new Mur(new Vector2D(0, 0), new Vector2D(rozmiarX, 0)));
        // mur z dołu
        mapa.addMur(new Mur(new Vector2D(0, rozmiarY), new Vector2D(rozmiarX, rozmiarY)));
        // mur z lewej
        mapa.addMur(new Mur(new Vector2D(0, 0), new Vector2D(0, rozmiarY)));
        // mur z prawej
        mapa.addMur(new Mur(new Vector2D(rozmiarX, 0), new Vector2D(rozmiarX, rozmiarY)));


        mapa.setWysokoscPlanszy(rozmiarY);
        mapa.setSzerokoscPlanszy(rozmiarX);
    }

    public static void wyznaczPozycje(ObiektRuchomy o, int rozmiarX, int rozmiarY)
    {
        Vector2D pozycja = new Vector2D(0, 0);

        do
        {
            pozycja.x = (int) (Math.random() * (rozmiarX - o.getPromien() - 5));
            pozycja.y = (int) (Math.random() * (rozmiarY - o.getPromien() - 5));
        } while (o.istniejaKolizje(pozycja));

        o.setPozycja(pozycja);
    }

    public static void wyznaczPozycjeWPromieniu(ObiektRuchomy o, int rozmiarX, int rozmiarY, int promien, ObiektRuchomy srodek)
    {
        Vector2D pozycja = new Vector2D(0, 0);
        do
        {
            pozycja.x = (int) (((2.0 * Math.random() - 1.0) * promien) + srodek.getPromien() + o.getPromien());
            pozycja.y = (int) (((2.0 * Math.random() - 1.0) * promien) + srodek.getPromien() + o.getPromien());

            pozycja = srodek.getPozycja().add(pozycja);
        } while (o.istniejaKolizje(pozycja) || (pozycja.x < 0 + o.getPromien() ||
                pozycja.y < 0 + o.getPromien() ||
                pozycja.x > rozmiarX - o.getPromien() - 5 ||
                pozycja.y > rozmiarY - o.getPromien() - 5));
        o.setPozycja(pozycja);
    }

    private void wyznaczPozycjeWPromieniu(ObiektRuchomy o, int rozmiarX, int rozmiarY, int promien, ObiektStaly srodek)
    {
        Vector2D pozycja = new Vector2D(0, 0);
        do
        {
            pozycja.x = (int) (((2.0 * Math.random() - 1.0) * promien) + srodek.getPromien() + o.getPromien());
            pozycja.y = (int) (((2.0 * Math.random() - 1.0) * promien) + srodek.getPromien() + o.getPromien());

            pozycja = srodek.getPozycja().add(pozycja);
        } while (o.istniejaKolizje(pozycja) || (pozycja.x < 0 + o.getPromien() ||
                pozycja.y < 0 + o.getPromien() ||
                pozycja.x > rozmiarX - o.getPromien() - 5 ||
                pozycja.y > rozmiarY - o.getPromien() - 5));
        o.setPozycja(pozycja);
    }
}